home *** CD-ROM | disk | FTP | other *** search
- program CountPwr;
-
- {$IFDEF Win32}
- {$APPTYPE CONSOLE}
- {$ENDIF}
-
- uses
- {$IFDEF Win32}
- Windows;
- {$ELSE}
- WinCrt, WinTypes, WinProcs;
- {$ENDIF}
-
- var
- PowerCount : integer;
- MultCount : integer;
-
- function CleanFastPower(X : double; N : cardinal) : double;
- begin
- Result := 1.0;
- if (N = 0) then Exit;
- while true do begin
- if Odd(N) then
- Result := X * Result;
- if (N = 1) then Exit;
- X := X * X;
- N := N div 2;
- end;
- end;
-
- function FastPower(X : double; N : cardinal) : double;
- var
- Finished : boolean;
- begin
- Result := 1.0;
- Finished := false;
- while not Finished do begin
- if (N = 0) then begin
- Finished := true;
- end
- else if (N = 1) then begin
- Result := X * Result;
- Finished := true;
- end
- else begin
- if Odd(N) then begin
- Result := X * Result;
- X := X * X;
- N := (N-1) div 2;
- end
- else {N is even} begin
- X := X * X;
- N := N div 2;
- end;
- end;
- end;
- end;
-
- function Power(X : double; N : cardinal) : double;
- begin
- inc(PowerCount);
- if (N = 0) then
- Result := 1.0
- else if (N = 1) then
- Result := X
- else begin
- Inc(MultCount);
- if Odd(N) then begin
- Inc(MultCount);
- Result := Power(X*X, (N-1) div 2) * X
- end
- else {N is even}
- Result := Power(X*X, N div 2);
- end;
- end;
-
- begin
- PowerCount := 0;
- MultCount := 0;
- writeln('1.2^50 = ', Power(1.2, 50):15:9);
- writeln('Calls made: ', PowerCount);
- writeln('Multiplies done: ', MultCount);
- writeln('1.2^64 = ', Power(1.2, 64):15:9);
- writeln('1.2^64 = ', FastPower(1.2, 64):15:9);
- writeln('1.2^64 = ', CleanFastPower(1.2, 64):15:9);
-
- readln;
- end.
-